﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Dominio;

namespace Interfaz
{
    public partial class VentanaArticulos : UserControl
    {
        #region atributos

        private static VentanaArticulos instance;
        private List<Articulo> lArticulos;
        private List<IVA> lIVAs;
        private int ultimoIdArticulo;
        private bool ingreso;
        private Articulo actualArticulo;

        #endregion

        #region constructor

        public VentanaArticulos()
        {
            InitializeComponent();
            ultimoIdArticulo = Sistema.getUltimoIdArticulo();            
            lIVAs = Sistema.getIVAs();
            comboBoxIVA.DataSource = lIVAs.ToArray();
            IVA unIVA = new IVA();
            unIVA.OID = -1;
            lIVAs.Add(unIVA);
            comboBoxBuscarIVA.DataSource = lIVAs.ToArray();
            comboBoxBuscarIVA.SelectedIndex = -1;
            lArticulos = new List<Articulo>();
            limpiarCampos();
        }

        public static VentanaArticulos getInstance()
        {
            if (instance == null)
            {
                instance = new VentanaArticulos();
            }
            instance.limpiarCampos();
            return instance;
        }

        #endregion

        #region eventos
        
        private void buttonBuscar_Click(object sender, EventArgs e)
        {            
            int idDesde = int.Parse(textBoxBuscarIdDesde.Text);
            int idHasta = int.Parse(textBoxBuscarIdHasta.Text);
            int stockDesde = int.Parse(textBoxBuscarStockDesde.Text);
            int stockHasta = int.Parse(textBoxBuscarStockHasta.Text);
            int idIva = -1;
            if (comboBoxBuscarIVA.SelectedIndex != -1)
            {                
                IVA iva = (IVA)comboBoxBuscarIVA.SelectedItem;
                idIva = iva.OID;
            }
            lArticulos = Sistema.buscarArticulos(idDesde, idHasta, textBoxBuscarCodigo.Text
                , textBoxBuscarNombre.Text, stockDesde, stockHasta, idIva);
            //listaArticulos.DataSource = lArticulos.ToArray();
            cargarArticulos();
            limpiarCampos();
        }

        private void buttonAceptar_Click(object sender, EventArgs e)
        {
            if (validarDatos())
            {   
                IVA unIVA = (IVA)comboBoxIVA.SelectedItem;
                actualArticulo.Nombre = TextoNombre.Text;
                actualArticulo.Codigo = TextoCodigo.Text;
                actualArticulo.Descripcion = TextoDescripcion.Text;
                //programar imagen                
                actualArticulo.IVA = unIVA;
                actualArticulo.FechaIngreso = DateTime.Now;
                actualArticulo.Stock = 0;
                if (ingreso)
                {
                    ultimoIdArticulo += 1;
                    actualArticulo.OID = ultimoIdArticulo;
                    actualArticulo.Imagen = actualArticulo.OID + ".jpg";
                    //Sistema.agregarArticulo(TextoCodigo.Text, TextoDescripcion.Text, dateTimePickerFechaIngreso.Value,
                    //    actualArticulo.Imagen, unIVA, TextoNombre.Text);
                    lArticulos.Add(actualArticulo);
                    limpiarCampos();
                }
                else
                {
                    //Sistema.modificarArticulo(TextoCodigo.Text, TextoDescripcion.Text, dateTimePickerFechaIngreso.Value,
                    //    actualArticulo.Imagen, unIVA, TextoNombre.Text, actualArticulo.Stock, true, actualArticulo);
                    limpiarCampos();
                }
            }
        }

        private void buttonNuevo_Click(object sender, EventArgs e)
        {
            limpiarCampos();
        }

        private void buttonEliminar_Click(object sender, EventArgs e)
        {
            try
            {
                if (listaClientes.SelectedIndices[0] != -1)
                {
                    Sistema.eliminarArticulo(actualArticulo);
                    lArticulos.Remove(actualArticulo);
                    limpiarCampos();
                }
            }   
            catch (Exception) { }
        }

        //private void listaArticulos_Click(object sender, EventArgs e)
        //{
        //    try
        //    {
        //        if (listaClientes.SelectedIndices[0] != -1)
        //        {
        //            ingreso = false;
        //            actualArticulo = (Articulo)listaArticulos.SelectedItem;
        //            LabelID.Text = actualArticulo.OID.ToString();
        //            TextoNombre.Text = actualArticulo.Nombre;
        //            TextoCodigo.Text = actualArticulo.Codigo;
        //            TextoDescripcion.Text = actualArticulo.Descripcion;
        //            dateTimePickerFechaIngreso.Value = actualArticulo.FechaIngreso;
        //            labelStock.Text = actualArticulo.Stock.ToString();
        //            buscarPosicionDeIVA();
        //        }
        //    }
        //    catch (Exception) { }
        //}

        private void listaArticulos_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                if (listaClientes.SelectedIndices[0] != -1)
                {
                    ingreso = false;
                    ListViewItem itemArticulo = (ListViewItem)listaArticulos.Items[listaArticulos.SelectedIndices[0]];
                    actualArticulo = (Articulo)itemArticulo.Tag;
                    LabelID.Text = actualArticulo.OID.ToString();
                    TextoNombre.Text = actualArticulo.Nombre;
                    TextoCodigo.Text = actualArticulo.Codigo;
                    TextoDescripcion.Text = actualArticulo.Descripcion;
                    dtpFechaIngreso.Value = actualArticulo.FechaIngreso;
                    labelStock.Text = actualArticulo.Stock.ToString();
                    buscarPosicionDeIVA();
                }
            }
            catch (Exception) { }
        }
                    

        private void ButtonCambImagen_Click(object sender, EventArgs e)
        {

        }

        private void textBoxBuscarIdDesde_TextChanged(object sender, EventArgs e)
        {
            try
            {
                int nro = int.Parse(textBoxBuscarIdDesde.Text);
            }
            catch
            {
                textBoxBuscarIdDesde.Text = "0";
            }
        }

        private void textBoxBuscarIdHasta_TextChanged(object sender, EventArgs e)
        {
            try
            {
                int nro = int.Parse(textBoxBuscarIdHasta.Text);
            }
            catch
            {
                textBoxBuscarIdHasta.Text = "1000000";
            }
        }

        private void textBoxBuscarStockDesde_TextChanged(object sender, EventArgs e)
        {
            try
            {
                int nro = int.Parse(textBoxBuscarStockDesde.Text);
            }
            catch
            {
                textBoxBuscarStockDesde.Text = "0";
            }
        }

        private void textBoxBuscarStockHasta_TextChanged(object sender, EventArgs e)
        {
            try
            {
                int nro = int.Parse(textBoxBuscarStockHasta.Text);
            }
            catch
            {
                textBoxBuscarStockHasta.Text = "1000000";
            }
        }
        private void cargarArticulos()
        {
            listaArticulos.Items.Clear();
            for (int i = 0; i < lArticulos.Count; i++)
            {
                ListViewItem itemArticulo = new ListViewItem();
                itemArticulo.Text = lArticulos[i].OID.ToString();
                itemArticulo.Tag = lArticulos[i];
                listaArticulos.Items.Add(itemArticulo);
                listaArticulos.Items[i].SubItems.Add(lArticulos[i].Codigo);
                listaArticulos.Items[i].SubItems.Add(lArticulos[i].Nombre);
            }
        }

        #endregion

        #region metodos

        private bool validarDatos()
        {
            bool ok = true;
            if (TextoNombre.Text.Equals("") && ok)
            {
                MessageBox.Show("Error. Nombre vacío");
                ok = false;
            }
            if (TextoCodigo.Text.Equals("") && ok)
            {
                MessageBox.Show("Error. Código vacío");
                ok = false;
            }
            if (comboBoxIVA.SelectedIndex == -1 && ok)
            {
                MessageBox.Show("Error. Debe seleccionar el IVA del artículo");
                ok = false;
            }
            if (ok)
            {
                try
                {
                    DateTime date = dtpFechaIngreso.Value;
                }
                catch (Exception)
                {
                    MessageBox.Show("Error en la fecha de ingreso");
                    ok = false;
                }
            }
            return ok;
        }

        private void limpiarCampos()
        {
            ingreso = true;
            TextoNombre.Text = "";
            TextoCodigo.Text = "";
            TextoDescripcion.Text = "";
            comboBoxIVA.SelectedIndex = -1;            
            LabelID.Text = "";
            labelStock.Text = "0";
            //listaArticulos.DataSource = lArticulos.ToArray();
            dtpFechaIngreso.Value = DateTime.Now;
            actualArticulo = new Articulo();
        }

        private void buscarPosicionDeIVA()
        {
            for (int i = 0; i < comboBoxIVA.Items.Count; i++)
            {
                IVA IVAAux = (IVA)comboBoxIVA.Items[i];
                if (actualArticulo.IVA.OID == IVAAux.OID)
                {
                    comboBoxIVA.SelectedIndex = i;
                }
            }
        }

        #endregion

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void tbxPrecio_TextChanged(object sender, EventArgs e)
        {
            try
            {
                int nro = int.Parse(tbxPrecio.Text);
            }
            catch
            {
                tbxPrecio.Text = "0";
            }
        }
        
    }
}
